package designPattern.creation.singletonpattern;

/**
 * 懒汉式单例 - 静态内部类<br/>
 * 外部类加载时不会立刻加载内部类; 只有第一次使用静态内部类中的成员时, 才会加载内部类
 * @author 张琪
 * @date 2023/1/29 17:17
 */
public class StaticSafeSingleton {

    static {
        System.out.println("外部类静态块");
    }

    private static class LazyHolder {
        static {
            System.out.println("内部类静态块");
        }
        // 添加 final 保证只初始化一次; 防止外部修改
        private static final StaticSafeSingleton INSTANCE = new StaticSafeSingleton();
    }
    private StaticSafeSingleton (){
        System.out.println("外部类构造函数");
    }

    /**
     * 利用类加载机制保证实例化时只有一个线程; 保证了只有一个线程创建对象, 从而保证了线程安全
     * @return
     */
    public static StaticSafeSingleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    public static void print(){
        System.out.println("11111111111111");
    }


    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(getInstance());
        }
    }
}
